package sicnu.cs.aps.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import sicnu.cs.aps.domain.entity.User;

import java.util.List;
import java.util.Optional;


/**
 * @author CaiKe
 */
@Mapper
public interface UserMapper extends BaseMapper<User> {

    /**
     * 查询username的数量
     *
     * @param username username
     * @return 数量
     */
    long countByUsername(@Param("username") String username);


    /**
     * 查询email数量
     *
     * @param email email
     * @return 数量
     */
    long countByEmail( @Param("email") String email);

    /**
     * 查询手机号数量
     *
     * @param mobile 手机号
     * @return 数量
     */
    long countByMobile( @Param("mobile") String mobile);

    /**
     * 查询用户id的数量
     *
     * @param id 用户id
     * @return 数量
     */
    long countByUserId(@Param("id") Long id);

    /**
     * 根据username 查找对应的用户
     *
     * @param username 用户名
     * @return 用户实体
     */
    Optional<User> findOptionalByUsername(@Param("username") String username);

    /**
     * 根据邮箱查找对应用户
     *
     * @param email 邮箱
     * @return 用户实体
     */
    Optional<User> findOptionalByEmail( @Param("email") String email);

    /**
     * 根据邮箱查找对应用户
     *
     * @param userId 用户id
     * @return 用户实体
     */
    Optional<User> findOptionalByUserId(@Param("userId") Long userId);

    /**
     * 更新密码
     *
     * @param userId   用户id
     * @param password 新密码
     */
    void updatePassword(@Param("userId") Long userId, String password);

    /**
     * 更新用户邮箱
     *
     * @param userId 用户id
     * @param email  邮箱
     * @return 更新条数
     */
    int updateEmail(@Param("userId") Long userId, @Param("email") String email);

    /**
     * 查找密码
     *
     * @param userId 用户id
     * @return 返回密码
     */
    String findPassword(Long userId);

    /**
     * 批量插入用户数据并返回影响行数
     *
     * @param users 用户数据
     * @return 影响行数
     */
    int insertBranch(@Param("users") List<User> users);

    /**
     * 查询所有的id，用于前后数据对比
     * @return 所有id
     */
    List<Long> selectId();
}
